{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 为什么Bagging能改进模型性能？（10分）\n",
    "\n",
    "首先说明什么是bagging模型：分别构造多个弱学习器，最终将多个弱学习器得到的结果求平均。\n",
    "1.这多个弱学习器相互之间是并行的关系，可以同时训练。\n",
    "2.对每个弱学习器的样本进行Bootstrap随机采样，通过遍历所有特征的所有阈值来找到最佳分割点，然后以这个分裂点进行弱学习器的构建。\n",
    "3.如果是分类任务，那么多个弱学习器投出最多票数的类别作为最终类别；如果是分类任务，那么把多个弱学习器得到的结果求平均作为最终的输出。\n",
    "\n",
    "其次，为什么Bagging能改进模型性能？\n",
    "先谈谈什么是偏差和方差？\n",
    "偏差：模型预测值的期望与真实值之间的差异，反应的是模型的拟合能力。\n",
    "方差：反应的是训练集的变化所导致的学习性能的变化，即刻画了数据扰动所造成的影响，模型过拟合时会出现较大的方差。\n",
    "而Bagging是对多个弱学习器求平均，这样能减少模型的方差，从而提高模型稳定性。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 随机森林中随机体现在哪些方面？（10分）\n",
    "\n",
    "(1). 每颗决策树样本选择随机\n",
    "(2). 每颗决策树特征选择随机\n",
    "(3). 在此基础上，再随机选择特征，然后从这些特征中再来遍历选择最优的分割点。这是同Bagging模型不同的地方。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 随机森林和GBDT的基学习器都是决策树。请问这两种模型中的决策树有什么不同。（10分）\n",
    "\n",
    "随机森林：属于特别的bagging模型，分类任务使用分类树，回归任务使用回归树。其构建决策树的方式是并行构造的，意思就是每棵决策树之间相互独立的，没有关系。\n",
    "\n",
    "GBDT：使用的是回归树模型，因为GBDT属于boosting模型，每一棵树是在前一棵树的基础之上建立的，属于串行的关系，最后是要将所有决策树的结果加起来的。所以如果使用分类树的话，那么结果相加是毫无意义的。比如说预测性别，第一棵树预测的分类结果是0（男生），第二棵树预测的结果是1（女生），这两棵树相加的结果是完全没有实际意义的。而只有使用回归树，相加才是有实际意义的。比方说预测年龄，第一棵树预测为20岁，第二棵树预测结果为3岁，那么最后的结果就是20+3=23岁。即使是分类任务，使用的也是回归树。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 请简述LightGBM的训练速度为什么比XGBoost快。（30分）\n",
    "\n",
    "(1). 直方图优化：\n",
    "在进行分割点选择的时候，XGBoost是需要遍历所有特征以及特征里面的所有阈值，并且还需要对特征先进行排序。这都需要消耗大量的时间。\n",
    "而LightGBM在选择分割点时，采用的是直方图算法。即对每个特征的取值按照要求的数量划分成N个bins，然后在遍历特征里的阈值就不需要遍历每个特征值 了，只需要遍历这N个分裂点，且不需要对特征值进行排序。大大缩短了时间。\n",
    "\n",
    "(2). Goss算法：\n",
    "XGBoost在每颗树进行样本选择的时候，虽然是随机选取部分样本，但每棵树其实都会存在许多相同的样本。\n",
    "而LightGBM在每棵树选择样本是采取的的是Goss算法。即在前一棵树迭代完之后，计算每一个样本的梯度值，再根据梯度值绝对值的大小，选取前n个最大梯度的样本，然后再在剩下的样本中随机选取m个样本，最后把这m+n个样本送到下一棵树继续学习。\n",
    "为什么可以按照梯度的大小来选取样本呢？因为梯度的大小可以表示误差的大小，比如说L2损失，梯度就是预测值减真实值，绝对值越大，说明误差越大。绝对值越小，说明预测的就越准确，就不需要再继续学习了，可以大大加快迭代速度。\n",
    "\n",
    "(3). 互斥特征捆绑：\n",
    "在高维的稀疏特征空间中，许多特征是互斥的（即多个特征之间每一个样本最多只有一个特征的取值为非0），那么就可以把这些特征捆绑在一起组成一个特征，然后再把这个特征构建直方图，这样在实现特征遍历时又可以加速了。\n",
    "\n",
    "(4). 直方图作差：\n",
    "在前面第一点的直方图优化算法中，怎么样评价是否这个分裂点是最佳分裂点呢？还是需要计算增益，这里增益的计算公式为：\n",
    "gain = S(L) * S(L)/N(L)+S(R)* S(R)/N(R)-S(P) * S(P)/N(P)\n",
    "其中，S为所有样本梯度之和，N为样本数，L/R/P表示左/右/父节点。 通过比较gain的大小来判断最佳分割点。\n",
    "这里在计算完父节点和左节点的梯度之和以后，右节点的梯度之和就不需要再遍历样本计算了，只需要S(P)-S(L)就可以了。\n",
    "这就是所谓的直方图作差，在这里又大大提升了速度。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
